package com.lm.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author lm_jcf
 * @date 2018/5/8 11:03
 */
public class SequnceFlowTest {

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //    部署流程定义
    @Test
    public void deploymentProcessDefinition(){

        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("/bpmn/" +
                "sequenceFlow.bpmn");

        Deployment deployment = processEngine.getRepositoryService()    //与流程定义和部署对象相关的额Service
                .createDeployment()     //创建一个部署对象
                .name("连线")
//                .addClasspathResource("bpmn/processVariables.bpmn")    //加载资源dpmn
                .addInputStream("sequenceFlow.bpmn", inputStreamBpmn)
                .deploy();   //完成部署

        System.out.println("流程Id"+deployment.getId());  //  601
        System.out.println("流程名称"+deployment.getName());

    }


    // 启动流程定义
    @Test
    public void startProcessInstance(){
        String processKey = "sequenceFlow";
        ProcessInstance pi = processEngine.getRuntimeService()      //与正在执行的流程实例和执行对象相关的Service
                .startProcessInstanceByKey(processKey);     //使用流程定义的Key启动流程实例，可以使之每次都启动最新版本的流程。
        System.out.println("流程实例ID："+pi.getId());
        System.out.println("流程定义ID："+pi.getProcessDefinitionId());
    }

    @Test
    public void findMyProcessTask() {
        String assignee = "赵六";
        List<Task> lists = processEngine.getTaskService()  //与正在执行的任务相关的Service
                .createTaskQuery()  //创建任务查询对象
                /** 查询条件  */
                .taskAssignee(assignee) //指定个人任务对象
//                .taskCandidateUser(taskCandidateUser) //组任务的办理人
//                .processDefinitionId()  //使用流程定义Id查询
//                .processInstanceId()    //使用流程实例ID
//                .executionId()  //使用执行对象id查询
                /** 排序*/
                .orderByTaskCreateTime().asc()  //使用创建时间升序排序
                /** 返回结果集*/
//                .singleResult()   //唯一结果集
//                .count()  //返回结果集的数量
//                .listPage()   //分页查询
                .list();

        if (lists != null && lists.size() > 0) {
            for (Task task : lists) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务创建时间:" + task.getCreateTime());
                System.out.println("任务办理人:" + task.getAssignee());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("执行对象ID:" + task.getExecutionId());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
            }
        }
    }


    @Test
    public void completeMyProcessTask(){
        String taskId = "2003";
        //完成任务的同事，设置流程变量，使用流程变量用来指定完成任务后，下一个连线，对应sequenceFlow。bpmn文件中${message=='不重要'}
        //的messaage
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("message","重要");
        processEngine.getTaskService()
                .complete(taskId,map);
        System.out.println("完成任务");
    }
}
